home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / lib / avahi / avahi-daemon-check-dns.sh next >
Linux/UNIX/POSIX Shell Script  |  2008-07-27  |  4KB  |  154 lines

  1. #!/bin/sh
  2. #
  3. # If we have an unicast .local domain, we immediately disable avahi to avoid
  4. # conflicts with the multicast IP4LL .local domain
  5.  
  6. PATH=/bin:/usr/bin:/sbin:/usr/sbin
  7.  
  8. RUNDIR="/var/run/avahi-daemon/"
  9. DISABLE_TAG="$RUNDIR/disabled-for-unicast-local"
  10. NS_CACHE="$RUNDIR/checked_nameservers"
  11.  
  12. AVAHI_DAEMON_DETECT_LOCAL=1
  13.  
  14. test -f /etc/default/avahi-daemon && . /etc/default/avahi-daemon
  15.  
  16. if [ "$AVAHI_DAEMON_DETECT_LOCAL" != "1" ]; then
  17.   exit 0
  18. fi
  19.  
  20. ensure_rundir() {
  21.   if [ ! -d ${RUNDIR} ] ; then 
  22.     mkdir -m 0755 -p ${RUNDIR}
  23.     chown avahi:avahi ${RUNDIR}
  24.   fi 
  25. }
  26.  
  27. dns_reachable() {
  28.   # If there are no nameserver entries in resolv.conf there is no dns reachable
  29.   $(grep -q nameserver /etc/resolv.conf) || return 1;
  30.  
  31.   # If there is no local nameserver and no we have no global ip addresses
  32.   # then we can't reach any nameservers
  33.   if ! $(egrep -q "nameserver 127.0.0.1|::1" /etc/resolv.conf); then 
  34.     # Get addresses of all running interfaces
  35.     ADDRS=$(LC_ALL=C ifconfig | grep ' addr:')
  36.     # Filter out all local addresses
  37.     ADDRS=$(echo "${ADDRS}" | egrep -v ':127|Scope:Host|Scope:Link')
  38.     if [ -z "${ADDRS}" ] ; then
  39.       return 1;
  40.     fi
  41.   fi
  42.  
  43.   return 0
  44. }
  45.  
  46. dns_has_local() { 
  47.   # Some magic to do tests 
  48.   if [ -n ${FAKE_HOST_RETURN} ] ; then
  49.     if [ "${FAKE_HOST_RETURN}" = "true" ]; then
  50.       return 0;
  51.     else
  52.       return 1;
  53.     fi
  54.   fi
  55.  
  56.   OUT=`LC_ALL=C host -t soa local. 2>&1`
  57.   if [ $? -eq 0 ] ; then
  58.     if echo "$OUT" | egrep -vq 'has no|not found'; then
  59.       return 0
  60.     fi
  61.   else 
  62.     # Checking the dns servers failed. Assuming no .local unicast dns, but
  63.     # remove the nameserver cache so we recheck the next time we're triggered
  64.     rm -f ${NS_CACHE}
  65.   fi
  66.   return 1
  67. }
  68.  
  69. dns_needs_check() {
  70.   TMP_CACHE="${NS_CACHE}.$$"
  71.   RET=0
  72.  
  73.   ensure_rundir
  74.   cat /etc/resolv.conf | grep "nameserver" | sort > ${TMP_CACHE} || return 0
  75.  
  76.   if [ -e ${NS_CACHE} ]; then 
  77.     DIFFERENCE=$(diff -w ${NS_CACHE} ${TMP_CACHE})
  78.     echo "${DIFFERENCE}" | grep -q '^>'
  79.     ADDED=$?
  80.     echo "${DIFFERENCE}" | grep -q '^<'
  81.     REMOVED=$?
  82.     # Avahi was disabled and no servers were removed, no need to recheck
  83.     [ -e ${DISABLE_TAG} ] && [ ${REMOVED} -ne 0 ]  && RET=1
  84.     # Avahi was enabled and no servers were added, no need to recheck
  85.     [ ! -e ${DISABLE_TAG} ] && [ ${ADDED} -ne 0 ]  && RET=1
  86.   fi
  87.  
  88.   mv ${TMP_CACHE} ${NS_CACHE}
  89.   return ${RET};
  90. }
  91.  
  92.  
  93. enable_avahi () {
  94.   # no unicast .local conflict, so remove the tag and start avahi again
  95.   if [ -e ${DISABLE_TAG} ]; then
  96.     rm -f ${DISABLE_TAG}
  97.     if [ -x "`which invoke-rc.d 2>/dev/null`" ]; then
  98.       invoke-rc.d avahi-daemon start || true
  99.     else
  100.       if [ -x "/etc/init.d/avahi-daemon" ]; then
  101.         /etc/init.d/avahi-daemon start || true
  102.       fi
  103.     fi
  104.   fi
  105. }
  106.  
  107. disable_avahi () {
  108.   [ -e ${DISABLE_TAG} ] && return
  109.  
  110.   if [ -x /etc/init.d/avahi-daemon ]; then
  111.     if [ -x "`which invoke-rc.d 2>/dev/null`" ]; then
  112.       invoke-rc.d --force avahi-daemon stop || true
  113.     else
  114.       if [ -x "/etc/init.d/avahi-daemon" ]; then
  115.         /etc/init.d/avahi-daemon stop || true
  116.       fi
  117.     fi
  118.     if [ -x /usr/bin/logger ]; then
  119.       logger -p daemon.warning -t avahi <<EOF
  120. Avahi detected that your currently configured local DNS server serves
  121. a domain .local. This is inherently incompatible with Avahi and thus
  122. Avahi disabled itself. If you want to use Avahi in this network, please
  123. contact your administrator and convince him to use a different DNS domain,
  124. since .local should be used exclusively for Zeroconf technology.
  125. For more information, see http://avahi.org/wiki/AvahiAndUnicastDotLocal
  126. EOF
  127.     fi
  128.   fi
  129.   ensure_rundir
  130.   touch ${DISABLE_TAG}
  131. }
  132.  
  133. if ! dns_reachable ; then
  134.   # No unicast dns server reachable, so enable avahi
  135.   enable_avahi
  136.   # And blow away the dns cache, so we force a recheck when the interface comes
  137.   # up again
  138.   rm -f ${NS_CACHE}
  139.   exit 0
  140. fi
  141.  
  142. # Check if the dns needs checking..
  143. dns_needs_check || exit 0
  144.  
  145. if dns_has_local ; then
  146.   # .local from dns server, disabling avahi
  147.   disable_avahi
  148. else
  149.   # no .local from dns server, enabling avahi
  150.   enable_avahi
  151. fi
  152.  
  153. exit 0
  154.